# Disponivel no pacote de programas como: envelope.py
from numpy import *
from numpy.random import *
from pylab import *

def amostra(n):
    """
    Esta funcao amostra de x e retorna
    um vetor mais curto que n.
    """
    x=uniform(0,1,n)
    y=uniform(0,1,n)*1.5
    fx=6*x*(1-x) # x tem distribuicao beta
    #retorna so os valores que satifazem a seguinte condicao:
    s=compress(y<fx,x)
    return s

def eficiencia(vector,n):
    """
    Testa a eficiencia da amostragem.
    retorna a probabilidade de aceitacao.
    """
    l = len(vector)
    prob = l/float(n)
    diff = n-l
    #n necessario para obter as amostras que faltam
    n2 = int(diff/prob) 
    vec2 = amostra(n2)
    s = concatenate((vector,vec2))
    #gera histograma
    nb, bins, patches = hist(s, bins=50, normed=0)
    xlabel('Amostra')
    ylabel('Probabilidade')
    title('Histograma de s: n=%s'% n)
    savefig('envelope.png', dpi=400)
    show()
    return s
    
def testRS():
    """
    Esta funcao testa o modulo
    """
    n=100000
    sample=amostra(n)
    eficiencia(sample,n)
       
if __name__ == '__main__':
    testRS()
